/**
 * Copyright c FOUNDER 2005 All Rights Reserved.

 * DBController.java
 */
package com.iori.common.db.dbctrl;

import java.sql.Connection;

import java.sql.SQLException;
import java.util.Enumeration;
import java.util.Iterator;
import java.util.ResourceBundle;

import org.apache.commons.configuration.PropertiesConfiguration;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.torque.Torque;
import org.apache.torque.TorqueException;
import org.apache.torque.dsfactory.DataSourceFactory;

import com.iori.common.db.DbUtil;

/**
 * [クラス名]<br>
 * データベースコントローラ<br>
 * <br>
 * [機能概要]<br>
 * データベースアクセスのための初期化処理を行う。<br>
 * <br>
 * [変更履歴]<br>
 * 2005/07/14 ver1.00 新規作成 zhanjc<br>
 * <br>
 *
 * @author zhanjc
 * @version 1.00
 */
public class DBController {

	/**
	 * ログ出力用のインスタンス生成
	 */

	protected static Log logger = LogFactory.getLog(DBController.class);

	/**
	 * Torqueの設定ファイル名
	 */
	private static final String TORQUE_CONFIG_FILE_NAME = "torque";

	/**
	 * Torqueのinitメソッドを呼び出し、データベースアクセスのための初期化を行う。
	 */
	public static void init() throws TorqueException {
		PropertiesConfiguration pConfig = null;
		try {
			if (!Torque.isInit()) {
				// Torqueパラメータの設定
				ResourceBundle bundle = ResourceBundle.getBundle(TORQUE_CONFIG_FILE_NAME);
				pConfig = new PropertiesConfiguration();
				String key = null;
				for (Enumeration e = bundle.getKeys(); e.hasMoreElements();) {
					key = (String) e.nextElement();
					pConfig.addProperty(key, bundle.getString(key));
				}
				Torque.init(pConfig);
				logger.debug("Torque.init.");
			}
		} catch (TorqueException ex) {
			logger.error("Error! in Torque initialize - " + ex.getMessage());
			throw ex;
		}

		//added by wangsh 20070731 start
		// 由于SharedPoolDataSource中存在bug，如果连接池非空时可以避免这一bug
		try{
            for (Iterator it = pConfig.getKeys(); it.hasNext();){
                String key = (String) it.next();
                if (key.endsWith(DataSourceFactory.FACTORY_KEY)){
                    String databaseName = key.substring(0, key.lastIndexOf('.'));
                    databaseName = databaseName.substring(databaseName.lastIndexOf('.')+1);
                    Connection conn = DbUtil.beginOptional(databaseName, false);
        			DbUtil.closeConnection(conn);
                }
            }
        }
		catch (SQLException e) {
			logger.error("Error:Can't get Connection!");
			throw new TorqueException(e);
		}
        catch (Exception e){
        	logger.error("Error reading adapter configuration", e);
            throw new TorqueException(e);
        }
        //added by wangsh 20070731 end
	}

	/**
	 * Torqueのshutdownメソッドを呼び出し、データベースアクセスの終了処理を行う。
	 */
	public static void shutdown() {
		try {
			Torque.shutdown();
			logger.debug("Torque is down.");
		} catch (Exception ex) {
			logger.error("Error! in Torque.shutdown().");
		}
	}
}
